package AnalizadorLexico;

import java.util.ArrayList;
import java.util.Iterator;

public class TabelaSimbolo {

    private ArrayList<elementosTabela> lista;
    private elementosTabela elementos;
    private static int id;

    public TabelaSimbolo() {
        lista = new ArrayList();
        id = 1;
        for (Definicoes.Lexemas dl : Definicoes.Lexemas.values()) {
            elementos = new elementosTabela();
            elementos.insereLexemaId(dl.getLexema(), id++);
            lista.add(elementos);
        }
        Iterator it = lista.iterator();
        elementos = new elementosTabela();
        for (Definicoes.NomeTokens nt : Definicoes.NomeTokens.values()) {
            elementos = (elementosTabela) it.next();
            elementos.insereToken(nt.name());
        }

    }

    public elementosTabela analisa(String lexema) {
        int count = 0;
        elementosTabela tempElementos = new elementosTabela();
        Iterator it = lista.iterator();

        while (it.hasNext()) {
            tempElementos = (elementosTabela) it.next();
            count++;
            if (tempElementos.getLexema().equals(lexema.toLowerCase())) {
                return tempElementos;
            }
        }
        AddTabela(lexema);
        tempElementos = (elementosTabela) lista.get(count);
        return tempElementos;
    }

    public void AddTabela(String lexema) {
        elementosTabela et = new elementosTabela();

        if (lexema.matches("^.$")) {
            if (lexema.length() < 15) {
                et.insere(lexema, "identificador", id++);
                lista.add(et);
            } else {
                System.out.println("Erro, passou de 15 caracteres");
            }
        } else if (lexema.matches("\\d+|\\d+\\.\\d+")) {
            et.insere(lexema, "num", id++);
            lista.add(et);
        } else if (lexema.matches("^[[A-Z][a-z]]\\w*{2}")) {
            if (lexema.length() < 15) {
                et.insere(lexema, "identificador", id++);
                lista.add(et);
            } else {
                System.out.println("Erro, passou de 15 caracteres");
            }
        } else if (lexema.matches("'.*\\w*\\d*'")) {
            et.insere(lexema, "literal", id++);
            lista.add(et);
        }
        // falta emitir mensagem de erro   
    }
}
